package edu.towson.cosc.cosc455.bmoran.compiler;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.io.FileNotFoundException;
import java.util.*;
public class MyCompiler {
	
	
	public static String token; 
	public static String html;
	static MyLexicalAnalyzer Lexer;
	static MySyntaxAnalyzer parser;
	static MySemanticAnalyzer generator;
	public static ArrayList<String> parseTree;
	public static ArrayList<String> goodTokens;
	public static ArrayList<ArrayList<String>> compareTokens;
	public static ArrayList<String> lolLang;
	public static ArrayList<String> htmlLang;
	public static String fileString;
	
	
	public static void main(String[] args) {
	
				
		/**
		 * Check that there is only one argument
		 */
		if (args.length != 1){
			System.err.println("ERROR!");
			System.exit(0);

		}
		/**
		 * Create a file scanner to take in an input file. Read in each line to one string
		 */
		String fileName = args[0];
		Scanner fileScan= null;
		try {
			fileScan = new Scanner(new File(fileName));
		} catch (FileNotFoundException e) {
			System.err.print("File does not exist");
			System.exit(0);
			e.printStackTrace();
		}
		
		fileString = "";
		while(fileScan.hasNext()){
			fileString += fileScan.nextLine();
			
		}
		
		/**
		 * Check that only files with the extension .lol are being loaded in
		 */
		String extension = "";
		int i = fileName.lastIndexOf('.');
		if (i>0){
			extension = fileName.substring(i+1);
			if (!extension.equals("lol")){
				System.out.println("Error. Your file is an incompatible type");
			}
		}
		
		
		/**
		 * initialize parse tree array
		 */
		parseTree = new ArrayList<String>();
		
		/**
		 * Create a 2D arraylist for the semantic analyzer to compare html and lolcode language arraylists
		 */
		compareTokens = new ArrayList<ArrayList<String>>();
		lolLang = new ArrayList<String>();
		htmlLang = new ArrayList<String>();
		compareTokens.add(lolLang);
		compareTokens.add(htmlLang);
		
		lolLang.add("#HAI");
		htmlLang.add("<html>");
		lolLang.add("#KTHXBYE");
		htmlLang.add("</html>");
		lolLang.add("#OBTW");
		htmlLang.add("<!--");
		lolLang.add("#TLDR");
		htmlLang.add("-->");
		lolLang.add("#MAEK HEAD");
		htmlLang.add("<head>");
		lolLang.add("#OIC");
		htmlLang.add("</head>");
		lolLang.add("#GIMMEH TITLE");
		htmlLang.add("<title>");
		lolLang.add("#MKAY");
		htmlLang.add("</title>");
		lolLang.add("#MAEK PARAGRAF");
		htmlLang.add("<p>");
		lolLang.add("#OIC");
		htmlLang.add("</p>");
		lolLang.add("#GIMMEH BOLD");
		htmlLang.add("<b>");
		lolLang.add("#MKAY");
		htmlLang.add("</b>");
		lolLang.add("#GIMMEH ITALICS");
		htmlLang.add("<i>");
		lolLang.add("#MKAY");
		htmlLang.add("</i>");
		lolLang.add("#MAEK LIST");
		htmlLang.add("<ul>");
		lolLang.add("#OIC");
		htmlLang.add("</ul>");
		lolLang.add("#GIMMEH ITEM");
		htmlLang.add("<li>");
		lolLang.add("#MKAY");
		htmlLang.add("</li>");
		lolLang.add("#GIMMEH NEWLINE");
		htmlLang.add("<br>");
		lolLang.add("#GIMMEH SOUNDZ");
		htmlLang.add("<audio controls><source src=\"");
		lolLang.add("#MKAY");
		htmlLang.add("\"></audio>");
		lolLang.add("#GIMMEH VIDZ");
		htmlLang.add("<iframe src=\"");
		lolLang.add("#MKAY");
		htmlLang.add("\"/>");
		lolLang.add("#I HAS A");
		htmlLang.add("");
		lolLang.add("#ITZ");
		htmlLang.add("");
		lolLang.add("#VISIBLE");
		htmlLang.add("");
	
		
		goodTokens = new ArrayList<>();
		goodTokens.add("#HAI");
		goodTokens.add("#KTHXBYE");
		goodTokens.add("#OBTW");
		goodTokens.add("#TLDR");
		goodTokens.add("#MAEK HEAD");
		goodTokens.add("#OIC");
		goodTokens.add("#GIMMEH TITLE");
		goodTokens.add("#MKAY");
		goodTokens.add("#MAEK PARAGRAF");
		goodTokens.add("#GIMMEH BOLD");
		goodTokens.add("#GIMMEH ITALICS");
		goodTokens.add("#MAEK LIST");
		goodTokens.add("#GIMMEH ITEM");
		goodTokens.add("#GIMMEH NEWLINE");
		goodTokens.add("#GIMMEH SOUNDZ");
		goodTokens.add("#GIMMEH VIDZ");
		goodTokens.add("#I HAS A");
		goodTokens.add("#ITZ");
		goodTokens.add("#VISIBLE");
	
		token = "";
		
		Lexer = new MyLexicalAnalyzer();
		Lexer.getNextToken();
		
		parser = new MySyntaxAnalyzer();
		parser.lolcode();
		
		html = "";
		
		generator = new MySemanticAnalyzer();
		generator.compare();
		
		
		
		/**
		 * write output file
		 */
	
				String fileNamee = args[0];
				fileNamee = fileNamee.substring(0, fileNamee.lastIndexOf("."));
				fileNamee += ".html";
				
				
				
				BufferedWriter writer = null;
		        try {
		            String nameOfFile = fileNamee;
		            File logFile = new File(nameOfFile);

		            writer = new BufferedWriter(new FileWriter(logFile));
		            writer.write(html);
		        } catch (Exception e) {
		            e.printStackTrace();
		        } finally {
		            try {
		                writer.close();
		            } catch (Exception e) {
		            }
		        }
		        
		   
		
	}
}